/**
 * 柱子配筋计算算法模块
 * 提供桥梁跨越大腿柱子配筋设计的计算功能
 * 包含偏心受压构件的钢筋面积计算、受压区高度计算等核心算法
 */

/**
 * 柱子配筋计算参数接口
 */
export interface ColumnReinforcementParams {
  /** 柱宽，单位mm */
  columnWidth: number;
  /** 柱长，单位mm */
  columnLength: number;
  /** 柱高，单位mm */
  columnHeight: number;
  /** 轴力，单位kN */
  axialForce: number;
  /** 混凝土强度设计值，单位MPa */
  shearForce: number;
  /** 偏心距，单位mm */
  eccentricityIndicator: number;
  /** 保护层厚度，单位mm */
  protectiveLayerThickness: number;
}

/**
 * 柱子配筋计算结果接口
 */
export interface ColumnReinforcementResult {
  /** 钢筋面积，单位mm² */
  steelArea: number;
  /** 总钢筋面积，单位mm² */
  totalSteelArea: number;
  /** 受压区高度，单位mm */
  compressionZoneHeight: number;
  /** 是否稳定 */
  isStable: boolean;
  /** 计算结果文本 */
  calculationResult: string;
  /** 配筋率 */
  reinforcementRatio: number;
  /** 建议文本 */
  suggestionText: string;
}

/**
 * 柱子配筋计算算法类
 * 实现桥梁跨越大腿柱子的配筋计算方法
 * 基于混凝土结构设计规范进行计算
 */
export class ColumnReinforcementAlgorithms {
  /**
   * 计算柱子配筋所需的各项参数
   * 基于偏心受压构件理论，考虑轴力、弯矩、混凝土强度等因素
   * 计算钢筋面积、受压区高度等关键设计参数
   * 
   * @param {number} columnLength 柱子长度h，单位mm
   * @param {number} columnWidth 柱子宽度b，单位mm
   * @param {number} columnHeight 柱子高度H，单位mm
   * @param {number} axialForce 轴力FN，单位N
   * @param {number} bottomMoment 柱底弯矩M，单位N·mm
   * @param {number} protectiveLayerThickness 保护层厚度，一般取40mm，单位mm
   * @param {number} shearForce 混凝土抗压强度设计值fcd，单位MPa，C25混凝土用11.9
   * @returns {Object} 柱子配筋计算结果对象
   * @returns {number} return.sectionArea - 截面面积(mm²)
   * @returns {number} return.momentToAxialRatio - 弯矩轴力比(mm)
   * @returns {number} return.minEccentricity - 最小偏心距(mm)
   * @returns {number} return.shearCoefficient - 抗剪系数
   * @returns {number} return.totalEccentricity - 总偏心距(mm)
   * @returns {number} return.effectiveHeight - 有效高度(mm)
   * @returns {number} return.heightToLengthRatio - 高长比
   * @returns {number} return.additionalEccentricity - 附加偏心距
   * @returns {number} return.eccentricityIndicator - 偏心距指标(mm)
   * @returns {boolean} return.eccentricityType - 偏心类型属性
   * @returns {number} return.adjustedEccentricity - 调整偏心距(mm)
   * @returns {number} return.compressionZoneHeight - 受压区高度(mm)
   * @returns {number} return.steelStrength - 钢筋强度设计值(MPa)
   * @returns {number} return.steelArea - 钢筋面积(mm²)
   */
  static columnReinforcement(
    columnLength: number,
    columnWidth: number,
    columnHeight: number,
    axialForce: number,
    bottomMoment: number,
    protectiveLayerThickness: number,
    shearForce: number
  ): {
    sectionArea: number;
    momentToAxialRatio: number;
    minEccentricity: number;
    shearCoefficient: number;
    totalEccentricity: number;
    effectiveHeight: number;
    heightToLengthRatio: number;
    additionalEccentricity: number;
    eccentricityIndicator: number;
    eccentricityType: boolean;
    adjustedEccentricity: number;
    compressionZoneHeight: number;
    steelStrength: number;
    steelArea: number;
  } {
    // 参数合理性检查：确保保护层厚度不大于柱子长度
    if (columnLength <= protectiveLayerThickness) {
      const adjustedProtectiveLayer = Math.min(protectiveLayerThickness, columnLength * 0.9);
      protectiveLayerThickness = adjustedProtectiveLayer;
    }

    // 计算柱截面面积
    const sectionArea = columnLength * columnWidth;
    
    // 计算弯矩轴力比（计算偏心距）
    const momentToAxialRatio = bottomMoment / axialForce;
    
    // 计算最小偏心距（取柱子长度的1/30和20mm中的较大值）
    const minEccentricity = Math.max(columnLength / 30, 20);
    
    // 计算抗剪系数，限制最大值为1
    const shearCoefficient = Math.min(0.5 / columnLength * columnWidth * shearForce / axialForce, 1);
    
    // 根据高长比确定高度系数
    const heightCoefficient = (columnHeight / columnLength < 15) ? 1 : 1.088;

    // 计算总偏心距
    const totalEccentricity = momentToAxialRatio + minEccentricity;
    
    // 计算有效高度，确保至少为1mm
    const effectiveHeight = Math.max(1, columnLength - protectiveLayerThickness);
    
    // 计算高长比
    const heightToLengthRatio = columnHeight / columnLength;
    
    // 计算附加偏心距
    const totalEccentricityToHeightRatio = totalEccentricity / effectiveHeight;
    const additionalEccentricityFactor = totalEccentricityToHeightRatio > 0 ? 
      1 / (1400 * totalEccentricityToHeightRatio) : 0;
    const additionalEccentricity = 1 + additionalEccentricityFactor * Math.pow(heightToLengthRatio, 2) * 
      shearCoefficient * heightCoefficient;
    
    // 计算偏心距指标，确保最小值为0.1
    const eccentricityIndicator = Math.max(0.1, totalEccentricity);
    
    // 判断偏心类型：当总偏心距大于0.3倍有效高度时为大偏心
    const eccentricityType = totalEccentricity > 0.3 * effectiveHeight ? false : true;

    // 计算调整偏心距，确保最小值为10mm
    const adjustedEccentricity = Math.max(10, eccentricityIndicator + columnLength / 2 - protectiveLayerThickness);
    
    // 计算受压区高度，确保最小值为10mm
    const compressionZoneHeight = Math.max(10, axialForce / (columnWidth * shearForce * 1000));
    
    // 钢筋强度设计值，默认取360MPa（HRB400级钢筋）
    const steelStrength = 360;
    
    // 根据偏心受压构件计算公式计算钢筋面积
    const numerator = axialForce * adjustedEccentricity - 
      shearForce * 1000 * columnWidth * compressionZoneHeight * (effectiveHeight - compressionZoneHeight / 2);
    const denominator = steelStrength * (effectiveHeight - protectiveLayerThickness);
    
    // 计算钢筋面积，确保满足最小配筋率要求且分母不为零
    let steelArea = 0;
    if (Math.abs(denominator) > 0.001) {
      // 最小配筋率为0.2%
      steelArea = Math.max(0.002 * sectionArea, numerator / denominator);
    } else {
      // 分母接近零时，使用最小配筋率
      steelArea = 0.002 * sectionArea;
    }
    
    // 限制最大配筋率为5%
    steelArea = Math.min(0.05 * sectionArea, steelArea);
    
    return {
      sectionArea,
      momentToAxialRatio,
      minEccentricity,
      shearCoefficient,
      totalEccentricity,
      effectiveHeight,
      heightToLengthRatio,
      additionalEccentricity,
      eccentricityIndicator,
      eccentricityType,
      adjustedEccentricity,
      compressionZoneHeight,
      steelStrength,
      steelArea,
    };
  }
}
